package com.cskaoyan.javase.array.var7;

/**
 * @description: 可变参数
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * Java1.5增加了新特性，可变参数
 * 适用于参数个数不确定，类型确定的情况，Java会自动把可变参数当作数组处理
 *
 * 需求：求很多个int类型数据的和，2，3，4，5....
 *
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 * 	方法体
 * }
 * 调用可变参数方法时，编译器会自动讲这些参数全部封装成一个数组，在方法体中可以以数组的形式访问这些参数
 *
 * 小知识点：
 * 语法糖：实现的原理不变，但是底层帮我们做，而不是自己做
 * 这种的特殊的语法称之为语法糖，后面还会碰到，随着Java的升级，Java中语法糖越来越多
 * 哪有什么岁月静好，只不过是有人替你负重前行
 *
 * 可变参数的一些使用细节：
 * 1，一个方法只能有一个可变长参数，并且这个可变参数必须是该方法的最后一个参数
 * 设计问题：如果这么做可能没有太大好处，但是不这么做会有很多麻烦，这种事情你做不做？
 * 所以直接一刀切
 * 2,调用方法时，如果有一个固定参数的方法匹配的同时，也可以与可变参数的方法匹配，则选择固定参数的方法
 *
 * 3,调用方法时，如果出现两个可变参数的方法都能匹配，则报错，这两个方法都无法调用了
 *
 * - 严格避免带有可变参数的方法发生重载，否则很容易导致方法永远无法调用
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        //定义一个数组
        /*int[] arr = {1, 2, 3};
        System.out.println(sum(arr));*/

        //但是我这个人比较懒，我就想这个方法我想传几个参数就传几个，不想定义数组

        //如果什么都不写，相当于数组长度为0
        //可能我比较自私，我能不做就不做，别人麻烦那是他的事
        //System.out.println(sum2(1,2));
        //sum2(1, 2);

        //编译器会不会比你还聪明？
        //如果你都无法判断走哪个方法，有歧义的时候
        //编译器也无法处理
        //编译器无法处理，它只能报错
        //sum2(1,2,3,4);

        //test(1);
    }

    //该方法计算多个int数值之和
    public static int sum(int[] arr) {
        //遍历这个数组，把数组中的所有元素加起来
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            //sum = sum + arr[i];
            sum += arr[i];
        }
        return sum;
    }

    //用可变参数改进
    //这个a变量本质上什么
    //'sum(int...)' is already defined in 'com.cskaoyan.javase.array.var7.Demo'
    //可变参数本质上是一个数组
    public static int sum2(int... arr) {
        //把这些数给加起来
        //既然可变参数是数组，那么a就是数组名
        //遍历这个数组，把数组中的所有元素加起来
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            //sum = sum + arr[i];
            sum += arr[i];
        }
        return sum;
    }

    /*public static void sum2(int a,int b){
        System.out.println("我是两个参数的固定方法");
    }*/

    public static int sum2(int a, int... arr) {
        //把这些数给加起来
        //既然可变参数是数组，那么a就是数组名
        //遍历这个数组，把数组中的所有元素加起来
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            //sum = sum + arr[i];
            sum += arr[i];
        }
        return sum;
    }


    //public static void test(double a){
    //}
}
